package br.ufc.great.dtx.tm.operations;

import java.io.Serializable;
import java.util.Vector;

import br.ufc.great.dataguide.DGElement;

/**
 * 
 * @author Leonardo Oliveira Moreira
 *
 * Classe abstrata utilizada para representar uma operação de transação
 */
public abstract class Operation implements Serializable {
	
	protected String id;
	protected int type;
	protected int state;
	protected String transactionId;
	protected Vector<Site> sites;
	protected String result = null;
	
	public static final int QUERY = 0;
	public static final int INSERT = 1;
	public static final int DELETE = 2;
	
	public static final int SHARED = 9;
	public static final int EXCLUSIVE = 10;
	
	public static final int STATE_ABORTED = 6;
	public static final int STATE_EXECUTED = 7;
	public static final int STATE_NONE = 8;
	
	protected Vector<DGElement> locks;
	
	public Operation(String id, int type, String transactionId) {
		this.id = id;
		this.type = type;
		this.transactionId = transactionId;
		locks = new Vector<DGElement>();
		this.state = STATE_NONE;
	}
	
	/**
	 * Método para retornar o tipo de operação
	 * 
	 * @return
	 */
	public int getType() {
		return type;
	}

	/**
	 * Método para retornar o estado da operação
	 * 
	 * @return
	 */
	public int getState() {
		return state;
	}

	/**
	 * Método para configurar o estado da operação
	 * 
	 * @param state
	 */
	public void setState(int state) {
		this.state = state;
	}

	public String getId() {
		return id;
	}
	
	/**
	 * Método para retornar o identificador da transação da operação
	 * 
	 * @return
	 */
	public String getTransactionId() {
		return transactionId;
	}
	
	/**
	 * Método utilizado para retornar o resultado da operação no formato string
	 * 
	 * @return
	 */
	public String getResult() {
		return result;
	}

	/**
	 * Método utilizado para configurar o resultado da operação no formato string
	 * 
	 * @param result
	 */
	public void setResult(String result) {
		this.result = result;
	}

	/**
	 * Método utilizado para retornar os bloqueios mantidos pela operação
	 * 
	 * @return
	 */
	//public Vector<DGElement> getLockings() {
	//	return locks;
	//}

	/**
	 * Método utilizado para configurar os bloqueios mantidos pela operação
	 * 
	 * @param locks
	 */
	//public void setLockings(Vector<DGElement> locks) {
	//	this.locks = locks;
	//}
	
	/**
	 * Método utilizado para imprimir uma string que identifica a operação
	 */
	public String toString() {
		String strOperation = getTransactionId() + "." + getId();
		return strOperation;
	}

	public Vector<Site> getSites() {
		return sites;
	}

	public void setSites(Vector<Site> sites) {
		this.sites = sites;
	}
	
}
